
// Object.entries()   Object.fromEntries()


// function Test() {
//   this.a = 1;
//   this.b = 2;
// }

// Test.prototype.c = 3;

// const test = new Test();

// console.log(test);

// for (let k in test) {
//   console.log(k, test[k]);
// }

// const testArr = Object.entries(test);

// console.log(testArr);

// for (let [ k, v ] of testArr) {
//   console.log(k, v);
// }





// 传入的参数比较

// const r = Object.entries(123); // 空数组
// const r = Object.entries(true); // 空数组
// const r = Object.entries(''); // 空数组
// const r = Object.entries([]); // 空数组

// 报错 Cannot convert undefined or null to object
// const r = Object.entries(null); // 报错
// const r = Object.entries(undefined); // 报错

// non-object argument will be coerced to an object 非对象参数将强制为对象
// const r = Object.entries('123'); // 二维数组 键为下标

// array like object 类数组对象
// const r = Object.entries({ a: 1, b: 2 }); // 二维数组 键为对象的键
// const r = Object.entries([1, 2, 3]); // 二维数组 键为下标

// console.log(r);





// const obj = {};

// Object.defineProperties(obj, {
//   a: {
//     value: 1,
//     enumerable: true
//   },
//   b: {
//     value: 2
//   }
// });

// const testArr = Object.entries(obj);
// console.log(testArr);

// for (let [ k, v ] of testArr) {
//   console.log(k, v);
// }

// const m = new Map();
// m.set('a', 1);
// m.set('b', 2);
// const m = new Map(testArr);
// const m = new Map([
//   [ 'a', 1 ]
// ]);

// console.log(m);



// const obj = {
//   a: 1,
//   b: 2
// }
// const objArr = Object.entries(obj);

// const m = new Map(objArr);
// console.log(m); // object is not iterable 不可迭代的数据


/**
 * Object.entries()
 * 
 * 1. 返回一个给定对象自身可枚举属性的键值对数组
 * 
 * 2. 排列与使用 for...in 循环遍历该对象时返回的顺序一致
 * （区别在于 for-in 循环还会枚举原型链中的属性）
 * 
 * 3. 传入的参数 为非对象参数将强制为对象，返回一个键值对数组，下标为键如：字符串、数组
 * 
 * 4. 传入的参数 为空字符串、空数组、布尔值、数字将返回空数组
 * 
 * 5. 传入的参数 为null、undefined 将报错
 * 
 * 
 * 作用：普通对象 转 键值对列表
 *       map 把键值对列表转map类型的数据
 */


// 简单实现 Object.entries --> [['a', 1], ['b', 2]] 键值对列表

const obj = {
  a: 1,
  b: 2
};

Object.prototype.c = 3;

Object.myEntries = function(obj) {
  let _pool = [];

  if (Object.prototype.toString.call(obj) === '[object Object]') {
    for (let k in obj) {
      if (obj.hasOwnProperty(k)) {
        let _arr = [k, obj[k]];
        _pool.push(_arr);
      }
    }
  }

  return _pool;
}

console.log(obj);

const testArr1 = Object.entries(obj);
console.log(testArr1);

const testArr2 = Object.myEntries(obj);
console.log(testArr2);





